package com.imooc.SmartChargeStation.demo.websocket.spring.conf;

import com.imooc.SmartChargeStation.demo.websocket.spring.handler.ImoocHandler;
import com.imooc.SmartChargeStation.demo.websocket.spring.interceptor.ImoocInterceptor;
import jakarta.annotation.Resource;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.socket.config.annotation.WebSocketConfigurer;
import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry;
import org.springframework.web.socket.server.HandshakeInterceptor;

/**
 * author: zpy
 * description: WebSocket(基于Spring注解) 配置类
 * date: 2024
 */

@Configuration
public class ImoocWebSocketConf implements WebSocketConfigurer {
/*
    1.怎么理解？
    WebSocketConfigurer接口，用于配置WebSocket相关参数，比如处理器、拦截器、跨域等。
    相当于一个“接待处”，登记了哪些URL路径可以接受WebSocket请求，以及连接的时候用什么处理器和拦截器
    拦截器：在WebSocket握手前后都会触发，用于身份验证
    处理器：在WebSocket握手之后触发，用于处理WebSocket请求
    2.工作流程是什么？
    客户端向配置的 URL（如/ws/server）发起 WebSocket 连接请求
    握手前：拦截器的beforeHandshake方法触发，完成身份验证等前置校验（校验失败则拒绝连接）
    协议升级：通过 WebSocket 标准握手流程，将 HTTP 连接升级为持久化的 WebSocket 连接
    握手后：拦截器的afterHandshake方法触发，可进行日志记录、资源初始化等操作
    连接建立：处理器开始工作，负责双向实时消息的接收、处理与发送
    通信过程：基于已建立的长连接，客户端与服务器进行实时数据交互
    连接终止：客户端或服务器主动断开连接，释放相关资源
 */
    //自定义拦截器（门卫）-检查来访者的身份
    @Resource
    private ImoocInterceptor interceptor ;

    //自定义处理器（服务员）-给来访者提供具体的服务
    @Resource
    private ImoocHandler handler;

    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {

        registry
                //处理器配置-指定/ws/server路径的请求由handler处理
                .addHandler(handler,"/ws/server")
                //拦截器配置-所有连接都会经过interceptor检查
                .addInterceptors(interceptor)
                //关闭跨域-允许任何来源的客户端连接
                .setAllowedOrigins("*");
    }
}
